package com.xuan.meihua.core;

import com.nlf.calendar.EightChar;
import com.nlf.calendar.Lunar;
import com.nlf.calendar.Solar;
import com.xuan.meihua.utils.CommonUtil;
import com.xuan.meihua.utils.DateUtil;
import lombok.Getter;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * 梅花易数
 *
 * @author kty
 */
//@Data
@Getter
public class MeiHua {

    /**
     * 农历日期
     */
    private Lunar lunar;
    /**
     * 公历日期
     */
    private Solar solar;
    /**
     * 农历日期
     */
    private String lunarStr;
    /**
     * 公历日期
     */
    private String solarStr;
    /**
     * 星期
     */
    private String week;

    /**
     * 八字
     */
    private List<String> baZi;
    /**
     * 八字五行
     */
    private List<String> baZiWuXing;
    /**
     * 八字旬空
     */
    private List<String> baZiXunKong;
    /**
     * 八字纳音
     */
    private List<String> baZiNaYin;

    /**
     * 卦码
     */
    private String guaMa;

    /**
     * 上卦数
     */
    private int shangGuaNumber;
    /**
     * 下卦数
     */
    private int xiaGuaNumber;
    /**
     * 动爻数
     */
    private int dongYaoNumber;
    /**
     * 变卦的上卦数
     */
    private int bianShangGuaNumber;
    /**
     * 变卦的下卦数
     */
    private int bianXiaGuaNumber;

    /**
     * 上卦
     */
    private String shangGua;
    /**
     * 下卦
     */
    private String xiaGua;
    /**
     * 动爻
     */
    private String dongYao;

    /**
     * 本卦
     */
    private String benGua;
    /**
     * 变卦
     */
    private String bianGua;
    /**
     * 互卦
     */
    private String huGua;
    /**
     * 错卦
     */
    private String cuoGua;
    /**
     * 综卦
     */
    private String zongGua;

    /**
     * 上卦卦象
     */
    private String shangGuaAs;
    /**
     * 下卦卦象
     */
    private String xiaGuaAs;
    /**
     * 本卦卦象
     */
    private String benGuaAs;
    /**
     * 变卦卦象
     */
    private String bianGuaAs;
    /**
     * 互卦卦象
     */
    private String huGuaAs;
    /**
     * 错卦卦象
     */
    private String cuoGuaAs;
    /**
     * 综卦卦象
     */
    private String zongGuaAs;

    /**
     * 本卦的六爻爻象（顺序：初爻、二爻、三爻、四爻、五爻、上爻。如：—, —, —, —, —, —）
     */
    private List<String> benGuaLiuYaoYaoXiang;
    /**
     * 变卦的六爻爻象（顺序：初爻、二爻、三爻、四爻、五爻、上爻。如：—, —, —, —, —, —）
     */
    private List<String> bianGuaLiuYaoYaoXiang;
    /**
     * 互卦的六爻爻象（顺序：初爻、二爻、三爻、四爻、五爻、上爻。如：—, —, —, —, —, —）
     */
    private List<String> huGuaLiuYaoYaoXiang;
    /**
     * 错卦的六爻爻象（顺序：初爻、二爻、三爻、四爻、五爻、上爻。如：—, —, —, —, —, —）
     */
    private List<String> cuoGuaLiuYaoYaoXiang;
    /**
     * 综卦的六爻爻象（顺序：初爻、二爻、三爻、四爻、五爻、上爻。如：—, —, —, —, —, —）
     */
    private List<String> zongGuaLiuYaoYaoXiang;

    /**
     * 本卦的六爻名称（顺序：初爻、二爻、三爻、四爻、五爻、上爻。如：初九, 九二, 九三, 九四, 九五, 上九）
     */
    private List<String> benGuaLiuYaoName;
    /**
     * 变卦的六爻名称（顺序：初爻、二爻、三爻、四爻、五爻、上爻。如：初九, 九二, 九三, 九四, 九五, 上九）
     */
    private List<String> bianGuaLiuYaoName;
    /**
     * 互卦的六爻名称（顺序：初爻、二爻、三爻、四爻、五爻、上爻。如：初九, 九二, 九三, 九四, 九五, 上九）
     */
    private List<String> huGuaLiuYaoName;
    /**
     * 错卦的六爻名称（顺序：初爻、二爻、三爻、四爻、五爻、上爻。如：初九, 九二, 九三, 九四, 九五, 上九）
     */
    private List<String> cuoGuaLiuYaoName;
    /**
     * 综卦的六爻名称（顺序：初爻、二爻、三爻、四爻、五爻、上爻。如：初九, 九二, 九三, 九四, 九五, 上九）
     */
    private List<String> zongGuaLiuYaoName;

    /**
     * 本卦的六爻爻辞（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
     */
    private List<String> benGuaLiuYaoYaoCi;
    /**
     * 变卦的六爻爻辞（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
     */
    private List<String> bianGuaLiuYaoYaoCi;
    /**
     * 互卦的六爻爻辞（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
     */
    private List<String> huGuaLiuYaoYaoCi;
    /**
     * 错卦的六爻爻辞（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
     */
    private List<String> cuoGuaLiuYaoYaoCi;
    /**
     * 综卦的六爻爻辞（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
     */
    private List<String> zongGuaLiuYaoYaoCi;

//************************************************************************************************************************************

    /**
     * 使用默认设置初始化（默认使用当前公历日期）
     */
    public MeiHua() {
        setDate(new MeiHuaSetting()); // ★获取并设置数据
    }

    /**
     * 使用公历日期初始化
     *
     * @param date 公历日期（如：2023-01-01-06-00-00）
     */
    public MeiHua(String date) {
        MeiHuaSetting setting = new MeiHuaSetting();
        setting.setDate(DateUtil.stringToDate(date, DateUtil.DATE_TIME_FORMAT_2));
        setDate(setting); // ★获取并设置数据
    }

    /**
     * 使用日期初始化
     *
     * @param date     日期（如：2023-01-01-06-00-00）
     * @param dateType 日期类型（0:公历，1:农历）
     */
    public MeiHua(String date, int dateType) {
        MeiHuaSetting setting = new MeiHuaSetting();
        setting.setDate(DateUtil.stringToDate(date, DateUtil.DATE_TIME_FORMAT_2));
        setting.setDateType(dateType);
        setDate(setting); // ★获取并设置数据
    }

    /**
     * 使用自定义设置初始化（若未设置日期则默认使用当前公历日期）
     *
     * @param setting 梅花易数设置
     */
    public MeiHua(MeiHuaSetting setting) {
        setDate(setting); // ★获取并设置数据
    }

//====================================================================================================================================

    /**
     * ★获取并设置数据
     *
     * @param setting 梅花易数设置
     */
    private void setDate(MeiHuaSetting setting) {

        // 初始化自定义数据
        initializeMeiHuaSetting(setting);

        // 计算数据
        baZiInfo(); // 计算八字五行、八字纳音、八字旬空
        shangGua(); // 计算[上卦]
        xiaGua(); // 计算[下卦]
        dongYao(); // 计算[动爻]
        guaMa(); // 计算卦码
        shangXiaGuaAs(); // 计算[上卦卦象、下卦卦象]
        benGua(); // 计算[本卦卦象、本卦]
        bianGua(); // 计算[变卦卦象、变卦]
        huGua(); // 计算[互卦卦象、互卦]
        cuoGua(); // 计算[错卦卦象、错卦]
        zongGua(); // 计算[综卦卦象、综卦]
        liuYaoYaoXiang(); // 计算[本卦、变卦、互卦、错卦、综卦]的六爻爻象（从下至上）
        liuYaoYaoMing(); // 计算[本卦、变卦、互卦、错卦、综卦]的六爻爻名（从下至上）
        liuYaoYaoCi(); // 计算[本卦、变卦、互卦、错卦、综卦]的六爻爻辞（从下至上）

        System.gc();

    }

    /**
     * 初始化自定义数据
     *
     * @param setting 梅花易数设置
     */
    private void initializeMeiHuaSetting(MeiHuaSetting setting) {

        // 1、数据校验
        int dateType = setting.getDateType(); // 日期类型（0:公历，1:农历）
        if (dateType != MeiHuaEnum.DATE_TYPE_SOLAR.getMark() && dateType != MeiHuaEnum.DATE_TYPE_LUNAR.getMark()) {
            setting.setDateType(MeiHuaEnum.DATE_TYPE_SOLAR.getMark());
        }

        // 2、☆判断日期类型并返回农历日期、公历日期
        Map<String, Object> map = MeiHuaUtil.isDateType(setting);

        // 3、设置日期
        if (map.size() == 4) {
            this.lunar = (Lunar) map.get("lunar"); // 农历日期
            this.solar = (Solar) map.get("solar"); // 公历日期
            this.lunarStr = (String) map.get("lunarStr"); // 农历日期
            this.solarStr = (String) map.get("solarStr"); // 公历日期
        } else {
            throw new NullPointerException("日期初始化失败");
        }

        // 4、设置星期
        this.week = "周" + getLunar().getWeekInChinese();

        // 5、☆判断四柱设置并返回八字
        this.baZi = MeiHuaUtil.isSiZhu(setting, getLunar());

        // 6、☆判断起卦模式
        if (setting.getQiGuaMode() == MeiHuaEnum.QI_GUA_MODE_SHI_JIAN.getMark()) {
            // 6.2、时间起卦方式
            shangXiaGuaNumber(); // 计算[上卦数、下卦数、动爻数]（根据时间起卦时调用）
        } else {
            // 6.2、其他起卦方式
            List<Integer> number = MeiHuaUtil.isQiGuaMode(setting);
            this.shangGuaNumber = number.get(0); // 设置上卦数
            this.xiaGuaNumber = number.get(1); // 设置下卦数
            this.dongYaoNumber = number.get(2); // 设置动爻数
        }

    }

    /**
     * 计算八字五行、八字纳音、八字旬空
     */
    private void baZiInfo() {

        EightChar ec = getLunar().getEightChar();

        // 1、设置八字五行
        this.baZiWuXing = Arrays.asList(ec.getYearWuXing(), ec.getMonthWuXing(), ec.getDayWuXing(), ec.getTimeWuXing()); // 八字五行

        // 2、设置八字纳音
        this.baZiNaYin = Arrays.asList(ec.getYearNaYin(), ec.getMonthNaYin(), ec.getDayNaYin(), ec.getTimeNaYin()); // 八字纳音

        // 3、设置八字旬空
        this.baZiXunKong = Arrays.asList(ec.getYearXunKong(), ec.getMonthXunKong(), ec.getDayXunKong(), ec.getTimeXunKong()); // 八字空亡

    }

    /**
     * 计算[上卦数、下卦数、动爻数]（根据时间起卦时调用）
     *
     * <p>计算方法↓</p>
     *
     * <p>上卦数：（年数+月数+日数）÷8得出的余数</p>
     * <p>下卦数：（年数+月数+日数+时数）÷8得出的余数</p>
     * <p>动爻数：（年数+月数+日数+时数）÷6得出的余数</p>
     */
    private void shangXiaGuaNumber() {

        Map<String, Integer> diZhiShu = MeiHuaMap.DI_ZHI_SHU; // 地支对应的数字（用于计算年数、月数、日数、时数）

        // 1.1、获取年数
        int yearNumber = diZhiShu.get(getLunar().getYearZhi());
        // 1.2、获取月数
        int monthNumber = getLunar().getMonth();
        // 1.3、获取日数
        int dayNumber = getLunar().getDay();
        // 1.4、获取时数
        int hourNumber = diZhiShu.get(getLunar().getTimeZhi());

        // 2、计算上卦数：（年数+月数+日数）÷8得出的余数
        int shangGuaNumber = ((yearNumber + monthNumber + dayNumber) % 8);
        this.shangGuaNumber = (shangGuaNumber == 0 ? 8 : shangGuaNumber); // 若除尽则统一用8表示

        // 3、计算下卦数：（年数+月数+日数+时数）÷8得出的余数
        int xiaGuaNumber = ((yearNumber + monthNumber + dayNumber + hourNumber) % 8);
        this.xiaGuaNumber = (xiaGuaNumber == 0 ? 8 : xiaGuaNumber); // 若除尽则统一用8表示

        // 4、计算动爻数：（年数+月数+日数+时数）÷6得出的余数
        int dongYaoNumber = ((yearNumber + monthNumber + dayNumber + hourNumber) % 6);
        this.dongYaoNumber = (dongYaoNumber == 0 ? 6 : dongYaoNumber); // 若除尽则统一用6表示

    }

    /**
     * 计算[上卦]
     */
    private void shangGua() {
        this.shangGua = MeiHuaMap.BA_GUA.get(getShangGuaNumber());
    }

    /**
     * 计算[下卦]
     */
    private void xiaGua() {
        this.xiaGua = MeiHuaMap.BA_GUA.get(getXiaGuaNumber());
    }

    /**
     * 计算[动爻]
     */
    private void dongYao() {
        this.dongYao = CommonUtil.shuToHan(getDongYaoNumber());
    }

    /**
     * 计算[卦码]
     */
    private void guaMa() {
        this.guaMa = "" + getShangGuaNumber() + getXiaGuaNumber() + getDongYaoNumber();
    }

    /**
     * 计算[上卦卦象、下卦卦象]
     */
    private void shangXiaGuaAs() {

        // 设置上卦卦象
        this.shangGuaAs = MeiHuaMap.BA_GUA_TU.get(getShangGua());
        // 设置下卦卦象
        this.xiaGuaAs = MeiHuaMap.BA_GUA_TU.get(getXiaGua());

    }

    /**
     * 计算[本卦卦象、本卦]
     *
     * <p> 根据'上卦数'和'下卦数'的组成获取。 </p>
     */
    private void benGua() {

        /* 说明：代表事物初始、开始阶段的信息或目前的情况。*/

        // 设置本卦卦象
        this.benGuaAs = getAs(getShangGuaNumber(), getXiaGuaNumber());
        // 设置本卦
        this.benGua = getGua(getBenGuaAs());

    }

    /**
     * 计算[变卦卦象、变卦]
     *
     * <p> 根据动爻数变化。 </p>
     */
    private void bianGua() {

        /* 说明：代表事物发展变化的最终结果。 */

        // 判断动爻数
        if (judgeDongYao()) {
            // 根据'下卦数'获取变化后的【下卦数】
            this.bianXiaGuaNumber = MeiHuaMap.BIAN_GUA.get(getXiaGuaNumber()).get(getDongYaoNumber() - 1);
        } else {
            // 根据'上卦数'获取变化后的【上卦数】
            this.bianShangGuaNumber = MeiHuaMap.BIAN_GUA.get(getShangGuaNumber()).get(getDongYaoNumber() - 4);
        }

        // 设置变卦卦象
        if (judgeDongYao()) {
            // 动爻数为(1\2\3)时：上卦不变、下卦变
            this.bianGuaAs = getAs(getShangGuaNumber(), getBianXiaGuaNumber());
        } else {
            // 动爻数为(4\5\6)时：上卦变、下卦不变
            this.bianGuaAs = getAs(getBianShangGuaNumber(), getXiaGuaNumber());
        }
        // 设置变卦
        this.bianGua = getGua(getBianGuaAs());

    }

    /**
     * 计算[互卦卦象、互卦]
     *
     * <p> 本卦的二三四爻做互卦的下卦、本卦的三四五卦做互卦的上卦。 </p>
     *
     * @deprecated 使用huGua()
     */
    @Deprecated
    private void huGuaOld() {

        /* 手动计算 */

        Map<String, List<Integer>> tuShu = MeiHuaMap.BA_GUA_TU_SHU; // 八卦代表卦象及其数字（自上而下：0为阴，1为阳）
        Map<List<Integer>, String> shuTu = MeiHuaMap.BA_GUA_SHU_TU; // 八卦上中下爻代表数字及其卦象（自上而下：0为阴，1为阳）
        Map<String, Integer> baGuaShu = MeiHuaMap.BA_GUA_SHU; // 先天八卦卦象代表的数字
        Map<String, String> sixGua = MeiHuaMap.LIU_SHI_SI_GUA; // 六十四卦

        // 1.1、获取本卦的[五爻、四爻]代表的数字 【注；由于本卦由上卦和下卦组成，故此处直接使用上卦作为本卦的上卦计算即可】
        int wuYao = tuShu.get(getShangGuaAs()).get(1); // 本卦的五爻
        int siYao = tuShu.get(getShangGuaAs()).get(2); // 本卦的四爻
        // 1.2、获取本卦的[三爻、二爻]代表的数字 【注；由于本卦由上卦和下卦组成，故此处直接使用下卦作为本卦的下卦计算即可】
        int sanYao = tuShu.get(getXiaGuaAs()).get(0); // 本卦的三爻
        int erYao = tuShu.get(getXiaGuaAs()).get(1); // 本卦的二爻

        // 2.1、构造互卦的上卦（本卦的三四五爻作为互卦的上卦）
        List<Integer> huShangGua = Arrays.asList(wuYao, siYao, sanYao);
        // 2.2、构造互卦的下卦（本卦的二三四爻作为互卦的下卦）
        List<Integer> huXiaGua = Arrays.asList(siYao, sanYao, erYao);

        // 3、获取并设置[互卦的（上、下）卦卦象]
        String huShangGuaAs = shuTu.get(huShangGua); // 互卦的上卦卦象
        String huXiaGuaAs = shuTu.get(huXiaGua); // 互卦的下卦卦象

        // 4、获取并设置[互卦的（上、下）卦数]
        int huShangGuaNumber = baGuaShu.get(huShangGuaAs); // 互卦的上卦数
        int huXiaGuaNumber = baGuaShu.get(huXiaGuaAs); // 互卦的下卦数

        // 5、设置互卦卦象、互卦
        this.huGuaAs = getAs(huShangGuaNumber, huXiaGuaNumber);
        this.huGua = sixGua.get(getHuGuaAs());

    }

    /**
     * 计算[互卦卦象、互卦]
     *
     * <p> 本卦的二三四爻做互卦的下卦、本卦的三四五卦做互卦的上卦。 </p>
     */
    private void huGua() {

        /* 说明：代表事物发展的过程。*/

        // 设置互卦卦象
        this.huGuaAs = getHuCuoZongAs(0);
        // 设置互卦
        this.huGua = getGua(getHuGuaAs());

    }

    /**
     * 计算[错卦卦象、错卦]
     *
     * <p> 本卦阳爻变阴爻，阴爻变阳爻。 </p>
     */
    private void cuoGua() {

        /* 说明：代表事物的危机或转机。若问题的结果（变卦）为吉，则错卦代表危机；若问题的结果（变卦）为凶，则错卦代表危机转机。*/

        // 设置错卦卦象
        this.cuoGuaAs = getHuCuoZongAs(1);
        // 设置错卦
        this.cuoGua = getGua(getCuoGuaAs());

    }

    /**
     * 计算[综卦卦象、综卦]
     *
     * <p> 将'本卦'上下180°旋转变为'综卦'。</p>
     */
    private void zongGua() {

        /* 说明：代表事物的另一个面，以第三者角度来综合观察这个事物。*/

        // 设置综卦卦象
        this.zongGuaAs = getHuCuoZongAs(2);
        // 设置综卦
        this.zongGua = getGua(getZongGuaAs());

    }

    /**
     * 计算[本卦、变卦、互卦、错卦、综卦]的六爻爻象
     */
    private void liuYaoYaoXiang() {

        Map<String, List<String>> yaoXiang = MeiHuaMap.LIU_SHI_SI_GUA_LIU_YAO_YAO_XIANG; // 六十四卦每一卦中的六爻爻象

        this.benGuaLiuYaoYaoXiang = yaoXiang.get(getBenGuaAs()); // 本卦的六爻爻象（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
        this.bianGuaLiuYaoYaoXiang = yaoXiang.get(getBianGuaAs()); // 变卦的六爻爻象（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
        this.huGuaLiuYaoYaoXiang = yaoXiang.get(getHuGuaAs()); // 互卦的六爻爻象（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
        this.cuoGuaLiuYaoYaoXiang = yaoXiang.get(getCuoGuaAs()); // 错卦的六爻爻象（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
        this.zongGuaLiuYaoYaoXiang = yaoXiang.get(getZongGuaAs()); // 综卦的六爻爻象（顺序：初爻、二爻、三爻、四爻、五爻、上爻）

    }

    /**
     * 计算[本卦、变卦、互卦、错卦、综卦]的六爻爻名
     */
    private void liuYaoYaoMing() {

        Map<String, List<String>> yaoMing = MeiHuaMap.LIU_SHI_SI_GUA_LIU_YAO_YAO_MING; // 六十四卦每一卦中的六爻爻名

        this.benGuaLiuYaoName = yaoMing.get(getBenGuaAs()); // 本卦的六爻爻名（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
        this.bianGuaLiuYaoName = yaoMing.get(getBianGuaAs()); // 变卦的六爻爻名（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
        this.huGuaLiuYaoName = yaoMing.get(getHuGuaAs()); // 互卦的六爻爻名（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
        this.cuoGuaLiuYaoName = yaoMing.get(getCuoGuaAs()); // 错卦的六爻爻名（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
        this.zongGuaLiuYaoName = yaoMing.get(getZongGuaAs()); // 综卦的六爻爻名（顺序：初爻、二爻、三爻、四爻、五爻、上爻）

    }

    /**
     * 计算[本卦、变卦、互卦、错卦、综卦]的六爻爻辞
     */
    private void liuYaoYaoCi() {

        Map<String, List<String>> yaoCi = MeiHuaMap.LIU_SHI_SI_GUA_LIU_YAO_YAO_CI; // 六十四卦每一卦中的六爻爻辞

        this.benGuaLiuYaoYaoCi = yaoCi.get(getBenGuaAs()); // 本卦的六爻爻辞（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
        this.bianGuaLiuYaoYaoCi = yaoCi.get(getBianGuaAs()); // 变卦的六爻爻辞（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
        this.huGuaLiuYaoYaoCi = yaoCi.get(getHuGuaAs()); // 互卦的六爻爻辞（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
        this.cuoGuaLiuYaoYaoCi = yaoCi.get(getCuoGuaAs()); // 错卦的六爻爻辞（顺序：初爻、二爻、三爻、四爻、五爻、上爻）
        this.zongGuaLiuYaoYaoCi = yaoCi.get(getZongGuaAs()); // 综卦的六爻爻辞（顺序：初爻、二爻、三爻、四爻、五爻、上爻）

    }

//------------------------------------------------------------------------------------------------------------------------------------

    /**
     * 获取（本\互\变）卦卦象
     *
     * @param shangGuaNumber 上卦数
     * @param xiaGuaNumber   下卦数
     * @return （本\互\变）卦卦象
     */
    private String getAs(int shangGuaNumber, int xiaGuaNumber) {

        // 构造key(上卦数+下卦数)，用于查询（本\互\变）卦
        List<Integer> key = Arrays.asList(shangGuaNumber, xiaGuaNumber);

        // 根据key值获取（本\互\变）卦卦象
        return MeiHuaMap.LIU_SHI_SI_GUA_AS.get(key);

    }

    /**
     * 获取（互\错\综）卦卦象
     *
     * @param index 索引值（0:互卦，1:错卦，2:综卦）
     * @return （互\错\综）卦卦象
     */
    private String getHuCuoZongAs(int index) {
        return MeiHuaMap.HU_CUO_ZONG.get(getBenGuaAs()).get(index);
    }

    /**
     * 获取（本\互\变\错\综）卦
     *
     * @param guaAs （本\互\变\错\综）卦卦象
     * @return （本\互\变\错\综）卦
     */
    private String getGua(String guaAs) {
        return MeiHuaMap.LIU_SHI_SI_GUA.get(guaAs);
    }

    /**
     * 获取动爻数区间范围
     *
     * @return true：动爻数为1\2\3   false：动爻数为4\5\6
     */
    private boolean judgeDongYao() {

        // 【动爻数为(1\2\3)时：上卦不变、下卦变】、【动爻数为(4\5\6)时：上卦变、下卦不变】
        return (getDongYaoNumber() >= 1 && getDongYaoNumber() <= 3);

    }

    /**
     * 判断（用卦、体卦）
     *
     * @param judge         0：上卦  1：下卦
     * @param dongYaoNumber 动爻数
     * @return 用卦\体卦
     * @deprecated 方法已弃用
     */
    @Deprecated
    public String yongOrTi(int judge, int dongYaoNumber) {

        // 根据'上下卦'判断（用卦\体卦）
        if (judge == 0) {
            // 判断'动爻数'
            if (dongYaoNumber > 3) {
                // 上卦为：(动)用卦
                return "用卦";
            } else return "体卦";
        } else {
            // 判断'动爻数'
            if (dongYaoNumber <= 3) {
                // 下卦为：(动)用卦
                return "用卦";
            } else return "体卦";
        }

    }

    @Override
    public String toString() {

        StringBuilder s = new StringBuilder();
        s.append("公历").append(getSolarStr());
        s.append("   ");
        s.append("农历").append(getLunarStr());
        s.append("   ");
        s.append("星期:").append(getWeek());
        s.append("   ");
        s.append("八字:").append(getBaZi());
        s.append("   ");
        s.append("八字五行:").append(getBaZiWuXing());
        s.append("   ");
        s.append("八字纳音:").append(getBaZiNaYin());
        s.append("   ");
        s.append("卦码:").append(getGuaMa());
        s.append("   ");
        s.append("上卦:").append(getShangGua()).append("(").append(getShangGuaAs()).append(")");
        s.append("   ");
        s.append("下卦:").append(getXiaGua()).append("(").append(getXiaGuaAs()).append(")");
        s.append("   ");
        s.append("动爻:").append(getDongYao());
        s.append("   ");
        s.append("本卦:").append(getBenGua()).append("(").append(getBenGuaAs()).append(")");
        s.append("   ");
        s.append("变卦:").append(getBianGua()).append("(").append(getBianGuaAs()).append(")");
        s.append("   ");
        s.append("互卦:").append(getHuGua()).append("(").append(getHuGuaAs()).append(")");
        s.append("   ");
        s.append("错卦:").append(getCuoGua()).append("(").append(getCuoGuaAs()).append(")");
        s.append("   ");
        s.append("综卦:").append(getZongGua()).append("(").append(getZongGuaAs()).append(")");

        return s.toString();

    }


}
